import { RootThunkAction } from '@/types/store'
import {
  UserProfile,
  UserProfileResponse,
  UserResponse,
  UserPhotoResponse,
} from '@/types/data'
import { http } from '@/utils/http'

// 返回数据类型
// type UserResponse = {
//   message: string
//   data: User
// }

// 异步 action creator 获取用户信息，因为在请求拦截器已经设置了 token 所以这里没有传递。
// 第一个跑通版本可以添加的类型约束就是 “RootThunkAction”
export const getUser = (): RootThunkAction => {
  return async (dispatch) => {
    // 获取用户信息
    const res = await http.get<UserResponse>('/user')
    // console.log(res)

    // 服务器端返回的用户信息
    const user = res.data.data

    // console.log('user 信息', user)
    // 获取网络数据后分发同步action
    dispatch({
      type: 'user/getUser',
      payload: user,
    })
  }
}

// 获取用户其它信息
export const getUserProfile = (): RootThunkAction => {
  return async (dispatch) => {
    // 1.发起请求
    const res = await http.get<UserProfileResponse>('/user/profile')
    const profile = res.data.data
    // console.log(profile)
    // 把数据交给reducer
    dispatch({ type: 'user/getUserProfile', payload: profile })
  }
}

// 修改用户信息
export const updateUserProfile = (
  userProfile: Partial<UserProfile>
): RootThunkAction => {
  return async (dispatch) => {
    // 更新用户的信息
    console.log('actions/user/更新用户的信息接受到的值:', userProfile)
    await http.patch('/user/profile', userProfile)
    // dispatch 同步 action 更新 redux 中的数据
    dispatch({ type: 'user/updateProfile', payload: userProfile })
  }
}

// 更新用户头像 action creator
export const updateUserPhoto = (file: FormData): RootThunkAction => {
  return async (dispatch) => {
    // 发起更新用户信息请求
    const res = await http.patch<UserPhotoResponse>('/user/photo', file)
    console.log('更新用户头像', res)

    // dispatch 同步 action 更新 redux 中的数据
    dispatch({
      type: 'user/updateProfile',
      payload: { photo: res.data.data.photo }, // 请注意这里是对象，更新其中的 photo 属性
    })
  }
}
